home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-ROM Collection / Amiga CD-ROM Collection - Auge 4000 and Cactus and Demo Util.iso / auge4000 / 46 / lib / time / localtime.c < prev    next >
C/C++ Source or Header  |  1990-06-20  |  1KB  |  50 lines

  1.  
  2. /*
  3.  *  time/localtime.c
  4.  */
  5.  
  6. #include <time.h>
  7.  
  8. static char dim[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  9.  
  10. struct tm *
  11. localtime(tp)
  12. const time_t *tp;
  13. {
  14.     static struct tm Tm;
  15.     time_t t = *tp;            /*  seconds since 1-jan-78  */
  16.     long days, years;
  17.     short leap, month;
  18.  
  19.     days = t / 86400 + 731;        /*  days since 1976 (lyp yr)*/
  20.  
  21.     Tm.tm_wday = (days + 4) % 7;
  22.     Tm.tm_sec = t % 60;
  23.     Tm.tm_min = t / 60 % 60;
  24.     Tm.tm_hour= t / (60*60) % 24;
  25.  
  26.     years = days / (366+365*3);             /*  #quad yrs       */
  27.     days -= years * (366+365*3);            /*  days remaining  */
  28.                         /*    0 = jan 1    */
  29.     leap = (days <= 365);                   /*  0-365, is a leap yr */
  30.     years = 1976 + 4 * years;            /*    base yr     */
  31.     if (leap == 0) {                        /*  days >= 366     */
  32.     days -= 366;                /*    add a year    */
  33.     ++years;
  34.     years += days / 365;            /*    non-lyrs left    */
  35.     days  %= 365;                /*    0-364        */
  36.     }
  37.     Tm.tm_yday = days;
  38.     Tm.tm_year = years - 1900;
  39.     Tm.tm_isdst= 0; /* ???? XXX     */
  40.  
  41.     for (month = 0; (month==1) ? (days >= 28 + leap) : (days >= dim[month]); ++month)
  42.     days -= (month==1) ? (28 + leap) : dim[month];
  43.  
  44.     Tm.tm_mon  = month;
  45.     Tm.tm_mday = days + 1;
  46.  
  47.     return(&Tm);
  48. }
  49.  
  50.